package com.iespring.service.app.address;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.iespring.bean.admin.user.entity.MallUser;
import com.iespring.bean.app.address.bo.AddressBo;
import com.iespring.bean.app.address.po.AddressPo;
import com.iespring.bean.app.address.vo.AddressVo;
import com.iespring.bean.common.BaseRespVo;
import com.iespring.bean.common.CommonData;
import com.iespring.mapper.app.AddressBackMapper;
import com.iespring.util.UserInfoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author weigwen
 * @Description:
 * @Date 2022/12/31 17:19
 */

@Service
public class AddressServiceImpl implements AddressService{

    @Autowired
    AddressBackMapper addressBackMapper;

    @Override
    public CommonData addressList() {
        MallUser user = UserInfoUtils.getUser();//获取当前用户
        List<AddressVo> addressVos = addressBackMapper.selectAddressByUserId(user.getId());//传入用户id用于收货地址的查询
        PageHelper.startPage(1, addressVos.size());
        PageInfo<AddressVo> addressVoPageInfo = new PageInfo<>(addressVos);
        PageHelper.clearPage();
        return CommonData.data(addressVoPageInfo);
    }

    @Override
    public BaseRespVo addressDetail(AddressBo addressBo) {
        AddressVo addressVo = addressBackMapper.selectAddressById(addressBo.getId());
        return BaseRespVo.ok(addressVo);
    }

    @Override
    public BaseRespVo addressSave(AddressBo addressBo) {
        AddressPo addressPo = new AddressPo();
        //获取当前用户
        MallUser user = UserInfoUtils.getUser();
        //获取当前用户id封装进入参addressBo
        addressBo.setUserId(user.getId());
        //首先，根据入参addressBo中id的值判断所要进行的是新增数据还是更新数据的操作
        //如果addressBo.getId() == 0，说明进行的是新增数据操作
        if (addressBo.getId() == 0){ //TODO 不确定入参addressBo中的id是赋值为0，还是给的默认值为0，若给的是默认值则此步骤可能报错
            System.out.println("----------------------进行的是新增数据操作------------------------");
            //此时应该判断新增的地址数据是否是默认地址
            if (addressBo.getIsDefault() == true){
                System.out.println("----------------------新增的地址数据是默认地址------------------------");
                //如果新增的地址数据是默认地址，需要更新地址列表中的其他数据的isDefault状态
                addressBackMapper.updateAllAddressIsNotDefault(user.getId());
                //然后判断要新增的数据是否是曾进行过逻辑删除的数据
                int code = addressBackMapper.updateDeletedAddress(addressBo);
                //直接对新增数据进行更新操作,如果更新成功(code == 1)则证明要新增的数据是曾进行逻辑删除的数据
                if (code == 1){
                    System.out.println("----------------------新增的地址数据是曾进行逻辑删除的数据------------------------");
                    //返回该数据的id
                    return BaseRespVo.ok(addressBo.getId());
                }
                //如果更新失败(code != 1)则说明要新增的数据不是逻辑删除数据，则进行插入数据操作
                //插入数据前要判断该新增数据是否已经存在于地址表中
                System.out.println("----------------------新增的地址数据不是曾进行逻辑删除的数据------------------------");
                int code10 = addressBackMapper.selectAddressIsExist(addressBo);
                //如果(addressPos.size() == 0)该新增数据在地址表中不存在
                if (code10 == 0){
                    System.out.println("----------------------新增的地址数据在地址表中不存在------------------------");
                    //插入该新增数据
                    int code1 = addressBackMapper.insertAddress(addressBo);
                    if (code1 != 1){
                        return BaseRespVo.invalidData(" 新增失败");
                    }
                    //返回该数据的id
                    return BaseRespVo.ok(addressBo.getId());
                }
                //如果(addressPos.size() != 0)该新增数据在地址表中已存在
                //修改该数据的默认地址状态
                System.out.println("----------------------新增的地址数据在地址表中已存在------------------------");
                addressBackMapper.updateAddressIsDefault(addressBo);
                return BaseRespVo.ok(addressBo.getId());
            }




            //如果新增的地址数据不是默认地址，不需要更新地址列表中的其他数据的isDefault状态
            //然后判断新增的数据是否是曾进行过逻辑删除的数据
            System.out.println("----------------------新增的地址数据不是默认地址------------------------");
            int code = addressBackMapper.updateDeletedAddress(addressBo);
            //直接对新增数据进行更新操作,如果更新成功(code == 1)则证明要新增的数据是曾进行逻辑删除的数据
            if (code == 1){
                //返回该数据的id
                System.out.println("----------------------新增的地址数据是曾进行逻辑删除的数据------------------------");
                return BaseRespVo.ok(addressBo.getId());
            }
            //如果更新失败(code != 1)则说明要新增的数据不是逻辑删除数据，则进行插入数据操作
            //插入数据前要判断该新增数据是否已经存在于地址表中
            System.out.println("----------------------新增的地址数据不是曾进行逻辑删除的数据------------------------");
            int code10 = addressBackMapper.selectAddressIsExist(addressBo);
            //如果(addressPos.size() == 0)该新增数据在地址表中不存在
            if (code10 == 0){
                //插入该新增数据
                System.out.println("----------------------新增的地址数据在地址表中不存在------------------------");
                int code1 = addressBackMapper.insertAddress(addressBo);
                if (code1 != 1){
                    return BaseRespVo.invalidData(" 新增失败");
                }
                //返回该数据的id
                return BaseRespVo.ok(addressBo.getId());
            }
            //如果(addressPos.size() != 0)该新增数据在地址表中已存在
            //修改该数据的默认地址状态
            System.out.println("----------------------新增的地址数据在地址表中已存在------------------------");
            return BaseRespVo.invalidData(" 该地址已存在");
        }





        //如果addressBo.getId() != 0，说明进行的是更新数据操作
        //进行更新操作，判断要更新的地址数据是否是默认地址
        System.out.println("----------------------进行的是更新数据操作------------------------");
        if (addressBo.getIsDefault() == true){
            System.out.println("----------------------更新的地址数据是默认地址------------------------");
            //是默认地址，需要更新地址列表中的其他数据的isDefault状态
            addressBackMapper.updateAllAddressIsNotDefault(user.getId());
            //判断更新的数据是否是曾进行过逻辑删除的数据
            Integer id1 = addressBo.getId();//保存原参数
            int code = addressBackMapper.updateDeletedAddress(addressBo);
            //直接对要更新的数据进行更新操作,如果更新成功(code == 1)则证明要更新的数据是曾进行逻辑删除的数据
            if (code == 1){
                System.out.println("----------------------更新的地址数据是曾进行逻辑删除的数据------------------------");
                //同时对原数据进行逻辑删除
                addressBackMapper.updateAddressDeletedStatus(id1);
                //返回更新成功后该数据的id
                return BaseRespVo.ok(addressBo.getId());
            }
            //如果更新失败(code != 1)则说明要更新的数据不是逻辑删除过的数据
            //更新数据前要判断该数据是否已经存在于地址表中
            System.out.println("----------------------更新的地址数据不是曾进行逻辑删除的数据------------------------");
            int code10 = addressBackMapper.selectAddressIsExist(addressBo);
            //如果(addressPos.size() == 0)该更新数据在地址表中不存在
            if (code10 == 0){
                System.out.println("----------------------更新的地址数据在地址表中不存在------------------------");
                //插入该新增数据
                int code1 = addressBackMapper.updateAddress(addressBo);
                if (code1 != 1){
                    return BaseRespVo.invalidData(" 更新失败");
                }
                //返回该数据的id
                return BaseRespVo.ok(addressBo.getId());
            }
            //如果(addressPos.size() != 0)该新增数据在地址表中已存在
            //修改该数据的默认地址状态
            System.out.println("----------------------更新的地址数据在地址表中已存在------------------------");
            Integer id2 = addressBo.getId();
            addressBackMapper.updateAddressIsDefault(addressBo);
//            addressBackMapper.updateAddressDeletedStatus(id2);
            return BaseRespVo.ok(addressBo.getId());
        }




        //如果更新的地址数据不是默认地址，不需要更新地址列表中的其他数据的isDefault状态
        //判断更新的数据是否是曾进行过逻辑删除的数据
        System.out.println("----------------------更新的地址数据不是默认地址------------------------");
        Integer id1 = addressBo.getId();//保存原参数id
        int code = addressBackMapper.updateDeletedAddress(addressBo);
        //直接对要更新的数据进行更新操作,如果更新成功(code == 1)则证明要更新的数据是曾进行逻辑删除的数据
        if (code == 1){
            System.out.println("----------------------更新的地址数据是曾进行逻辑删除的数据------------------------");
            //同时对原有数据进行逻辑删除
            addressBackMapper.updateAddressDeletedStatus(id1);
            //返回更新成功后该数据的id
            return BaseRespVo.ok(addressBo.getId());
        }
        //如果更新失败(code != 1)则说明要更新的数据不是逻辑删除数据，则进行更新数据操作
        //更新数据前要判断该数据是否已经存在于地址表中
        System.out.println("----------------------更新的地址数据不是曾进行逻辑删除的数据------------------------");
        int code10 = addressBackMapper.selectAddressIsExist(addressBo);
        //如果(addressPos.size() == 0)该更新数据在地址表中不存在
        if (code10 == 0){
            //插入该数据
            System.out.println("----------------------更新的地址数据在地址表中不存在------------------------");
            int code1 = addressBackMapper.updateAddress(addressBo);
            if (code1 != 1){
                return BaseRespVo.invalidData(" 更新失败");
            }
            //返回该数据的id
            return BaseRespVo.ok(addressBo.getId());
        }
        //如果(addressPos.size() != 0)该数据在地址表中已存在
        //修改该数据的默认地址状态
        System.out.println("----------------------更新的地址数据在地址表中已存在------------------------");
        return BaseRespVo.invalidData(" 该地址已存在");
    }

    @Override
    public BaseRespVo addressDelete(AddressBo addressBo) {
        int code = addressBackMapper.updateAddressDeletedStatus(addressBo.getId());
        if (code != 1){
            return BaseRespVo.invalidData(" 删除失败！！！");
        }
        return BaseRespVo.ok();
    }

}
